package ar.com.ctrln.view.dashboard.mantenimiento.ticket;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.zkoss.spring.security.SecurityUtil;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Hlayout;
import org.zkoss.zul.Image;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Timer;
import org.zkoss.zul.Toolbar;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.calendar.RegistrarEvento;
import ar.com.ctrln.control.mantenimiento.ticket.RegistrarTicket;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.contacto.Contacto;
import ar.com.ctrln.persistence.model.contratacion.ContratacionServicio;
import ar.com.ctrln.persistence.model.evento.EventoCalendario;
import ar.com.ctrln.persistence.model.evento.EventoTicket;
import ar.com.ctrln.persistence.model.organizacion.TipoActividad;
import ar.com.ctrln.persistence.model.organizacion.TipoOrganizacion;
import ar.com.ctrln.persistence.model.persona.Cargo;
import ar.com.ctrln.persistence.model.persona.Direccion;
import ar.com.ctrln.persistence.model.persona.Provincia;
import ar.com.ctrln.persistence.model.persona.Telefono;
import ar.com.ctrln.view.render.mantenimiento.ticket.SelectClienteRowRender;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;
import ar.com.ctrln.persistence.model.persona.Localidad;
import ar.com.ctrln.persistence.model.servicios.Servicio;
import ar.com.ctrln.persistence.model.servicios.TipoServicio;
import ar.com.ctrln.persistence.model.sistema.cuentas.Autorizacion;
import ar.com.ctrln.persistence.model.sistema.cuentas.Usuario;
import ar.com.ctrln.persistence.model.ticket.EstadoTicket;
import ar.com.ctrln.persistence.model.ticket.Ticket;
import ar.com.ctrln.persistence.model.ticket.TipoTicket;

@SuppressWarnings("unused")
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class RegistrarTicketController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7293861791737040132L;

	@WireVariable
	private RegistrarTicket registrarTicket;

	@WireVariable
	private RegistrarEvento registrarEvento;

	private Ticket ticket;

	private EstadoTicket estadoTicket;

	private Cliente emisor;
	
	private boolean isAuthored=false;
	
	private Usuario user;

	@SuppressWarnings("rawtypes")
	private EventQueue eq;

	@Wire
	private Window wRegistrarTicket;
	
	@Wire
	private Hlayout hbClienteSelect;

	@Wire
	private Button btnSelectEmisor;

	@Wire
	private Textbox tbDescripcion;

	@Wire
	private Label lClienteSelect;

	@Wire
	private Combobox cboTipoTicket;

	@Wire
	private Combobox cboTipoServicio;

	@Wire
	private Combobox cboServicio;

	@Wire
	private Toolbarbutton btnRegistrarTicket;

	@Wire
	private Popup popupExito;

	@Wire
	private Popup popup;

	@Wire
	private Label popText;

	@Wire
	private Timer timer;

	private Toolkit toolkit;

	private Dimension scrnsize;

	private TipoServicio tipoServicio;

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		ticket = new Ticket();
		user = (Usuario)SecurityUtil.getAuthentication().getPrincipal();
		Set<Autorizacion> autorizaciones = (Set<Autorizacion>) user.getAuthorities();
		
		for (Autorizacion auto : autorizaciones){
			if(auto.getAuthority().equals("ROLE_COOPERATIVA_TECNICO"))
				isAuthored=true;
		}
		
		if(isAuthored){
			hbClienteSelect.setVisible(false);
			emisor =(Cliente) user.getContacto().getOrganizacion();
		}
		eq = EventQueues.lookup("interactive", EventQueues.DESKTOP, true);
		eq.subscribe(new EventListener() {
			public void onEvent(Event event) throws Exception {
				emisor = (Cliente) event.getData();
				lClienteSelect.setValue(emisor.getRazonSocial());
			}
		});
	}

	@Listen("onClick = #btnSelectEmisor")
	public void selectEmisor() {
		Executions.createComponents("/zul/reusables/seleccionarCliente.zul",
				null, null);
	}

	@Listen("onCreate = #cboTipoTicket")
	public void cargarTipoTicket() {
		cboTipoTicket.setModel(new ListModelList<TipoTicket>(registrarTicket.listaTipoTicket()));
	if(isAuthored){
		ListModelList<TipoTicket> model =(ListModelList<TipoTicket>) cboTipoTicket.getModel();
	model.removeRange(2,4);
	}
	}

	@Listen("onCreate = #cboTipoServicio")
	public void cargarTipoServicio() {
		Set<TipoServicio> tiposServicio =new HashSet<TipoServicio>();
		if(!isAuthored){
		cboTipoServicio.setModel(new ListModelList<TipoServicio>(registrarTicket.listaTipoServicio()));
		}
		else{
			if(registrarTicket.listaContratacionPorCliente(user.getContacto().getOrganizacion().getId())!=null){
			List<ContratacionServicio> contratos=registrarTicket.listaContratacionPorCliente(user.getContacto().getOrganizacion().getId());
			for (ContratacionServicio con : contratos){
				tiposServicio.add(con.getTipoServicio());
				
			}
			cboTipoServicio.setModel(new ListModelList<TipoServicio>(tiposServicio));
			}

		}
	}

	@Listen("onCreate = #cboServicio")
	public void cargarServicios() {
		cboServicio.setModel(new ListModelList<Servicio>(registrarTicket
				.listaServicios()));
	}

	
	@Listen("onClick = #btnRegistrarTicket")
	public void registrarTicket() {

		if(cboTipoTicket.getText().equals("Seleccione ...") || cboTipoServicio.getText().equals("Seleccione ...")|| cboServicio.getText().equals("Seleccione ...")|| emisor==null )
		{
			Clients.showNotification("Antes debe completar los campos faltantes",Clients.NOTIFICATION_TYPE_INFO, btnRegistrarTicket, "before_center", 6000);
	
		}
		else{
		
		EventoTicket evento = (EventoTicket) registrarEvento
				.getEvento(RegistrarEvento.EVENTO_TICKET);

		if (null == evento){
			evento = new EventoTicket();
		}
		
		ticket.setTipoTicket((TipoTicket) cboTipoTicket.getModel()
				.getElementAt(cboTipoTicket.getSelectedIndex()));
		ticket.setDescripcion(tbDescripcion.getText());
		ticket.setOrganizacion(emisor);
		ticket.setServicio((Servicio) cboServicio.getModel().getElementAt(
				cboServicio.getSelectedIndex()));
		ticket.setEstado(Ticket.ESTADO_PENDIENTE);

		switch ((int) ticket.getTipoTicket().getId()) {
		case 1:
			ticket.setPrioridad("Muy Alta");
			break;
		case 2:
			ticket.setPrioridad("Media");
			break;
		case 3:
			ticket.setPrioridad("Alta");
			break;
		case 4:
			ticket.setPrioridad("Baja");
			break;
		}

		ticket.setFechaAlta(new Date());
		ticket.setFechaFinalizacion(null);
		long limite = new Date().getTime() + (2 * 24 * 60 * 60 * 1000);
		ticket.setFechaLimite(new Date(limite));
		registrarTicket.guardarTicket(ticket);

		// agregado de evento ticket (clase aparte para que no joda mucho con la
		// clase ticket, se podria extender de eventoCalendario, pero mejor no
		// romper)

		evento.setTitle(ticket.getOrganizacion().getRazonSocial() + " "
				+ ticket.getEstado());
		evento.setTicket(ticket);
		evento.setBeginDate(ticket.getFechaAlta());
		evento.setEndDate(ticket.getFechaLimite());
		evento.setContent(ticket.getOrganizacion().getRazonSocial() + " "
				+ ticket.getEstado());
		evento.setLoked(true);

		//hay que buscar una manera mas practica
		Collection<Autorizacion> autorizaciones = new ArrayList<Autorizacion>();
	
		Autorizacion autorizacion = registrarEvento
				.buscarAutorizacion("ROLE_MANTENIMIENTO");
		autorizaciones.add(autorizacion);
		
		evento.setAutorizaciones(autorizaciones);

		//registrarEvento.nuevoEvento(evento);

		wRegistrarTicket.onClose();
		Clients.showNotification("El Ticket se registro con exito!",
				Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 2500);
		popup.close();
		}
	}

	@Listen("onSelect = #cboTipoServicio")
	public void seleccionServicio() {
		cboServicio.setText("Seleccione ...");
		tipoServicio = (TipoServicio) cboTipoServicio.getModel().getElementAt(
				cboTipoServicio.getSelectedIndex());
		cboServicio.setModel(new ListModelList<Servicio>(registrarTicket
				.listaServiciosPorTipo(tipoServicio.getId())));
	}
}
